// authController.js - 身份验证控制器
const User = require('../models/user');
const asyncHandler = require('express-async-handler');

// 用户注册
exports.register = async (req, res) => {
  try {
    const { username, email, password, role } = req.body;
    
    // 检查用户是否已存在
    const existingUser = await User.findOne({ 
      $or: [{ email }, { username }]
    });
    
    if (existingUser) {
      return res.status(400).json({ 
        success: false, 
        message: '用户名或电子邮件已存在' 
      });
    }
    
    // 创建新用户
    const user = new User({
      username,
      email,
      password,
      role: role || 'student'
    });
    
    // 保存用户
    await user.save();
    
    // 返回用户信息（不含密码）
    res.status(201).json({
      success: true,
      message: '注册成功',
      data: user.getPublicProfile()
    });
  } catch (error) {
    res.status(500).json({
      success: false,
      message: '注册失败',
      error: error.message
    });
  }
};

// 用户登录
exports.login = async (req, res) => {
  try {
    const { username, password } = req.body;
    
    // 查找用户
    const user = await User.findOne({ 
      $or: [{ email: username }, { username }] 
    }).select('+password'); // 需要包含密码字段用于验证
    
    // 用户不存在
    if (!user) {
      return res.status(401).json({
        success: false,
        message: '用户名或密码不正确'
      });
    }
    
    // 验证密码 (示例实现，实际应用中应使用哈希比较)
    const isMatch = user.comparePassword(password);
    
    if (!isMatch) {
      return res.status(401).json({
        success: false,
        message: '用户名或密码不正确'
      });
    }
    
    // 生成令牌（实际应用中应该使用JWT）
    const token = "example_token_" + Date.now();
    
    // 返回用户信息和令牌
    res.status(200).json({
      success: true,
      message: '登录成功',
      data: {
        user: user.getPublicProfile(),
        token
      }
    });
  } catch (error) {
    res.status(500).json({
      success: false,
      message: '登录失败',
      error: error.message
    });
  }
};

// 保护中间件 - 验证用户登录状态
exports.protect = asyncHandler(async (req, res, next) => {
  try {
    let token;
    if (req.headers.authorization && req.headers.authorization.startsWith('Bearer')) {
      token = req.headers.authorization.split(' ')[1];
    }
    
    if (!token) {
      res.status(401);
      throw new Error('未授权访问，请先登录');
    }

    // 验证token逻辑
    const decoded = verifyToken(token); 
    req.user = await User.findById(decoded.id);
    next();
  } catch (err) {
    res.status(401).json({
      success: false,
      message: '无效的访问令牌'
    });
  }
});

// 管理员检查中间件
exports.adminCheck = asyncHandler(async (req, res, next) => {
  if (req.user && req.user.role === 'admin') {
    next();
  } else {
    res.status(403);
    throw new Error('需要管理员权限');
  }
});


// 获取当前用户信息
exports.getCurrentUser = async (req, res) => {
  try {
    // 实际应用中，应从JWT令牌中获取用户ID
    // 这里为了示例，假设用户ID通过查询参数传入
    const userId = req.query.userId;
    
    if (!userId) {
      return res.status(401).json({
        success: false,
        message: '未授权，请先登录'
      });
    }
    
    const user = await User.findById(userId);
    
    if (!user) {
      return res.status(404).json({
        success: false,
        message: '用户不存在'
      });
    }
    
    res.status(200).json({
      success: true,
      data: user.getPublicProfile()
    });
  } catch (error) {
    res.status(500).json({
      success: false,
      message: '获取用户信息失败',
      error: error.message
    });
  }
};